package io.mft.commons.db.mapper.proxyinvoker.invoker;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import cn.hutool.db.Entity;
import cn.hutool.db.Session;
import cn.hutool.db.handler.EntityListHandler;
import io.mft.commons.db.DbUtil;
import io.mft.commons.db.ISQLParameter;
import io.mft.commons.db.SQL;
import io.mft.commons.db.mapper.Pager;
import io.mft.commons.db.mapper.builder.ParameterWrapper;
import io.mft.commons.db.mapper.exception.MapperException;
import io.mft.commons.db.mapper.proxyinvoker.IProxyInvoker;
import io.mft.commons.function.response.kv.KVMap;
public class PagerProxyInvoker implements IProxyInvoker<Pager> {

	@Override
	public Pager invoke(Method method, Session session, ISQLParameter sqlParameter, KVMap parameter,
			ParameterWrapper methodArgs) throws Exception{
		Pager pager=null;
		if (methodArgs.getArgs()!=null) {
			for (Object arg : methodArgs.getArgs()) {
				if (arg instanceof Pager) {
					pager=(Pager)arg;
					break;
				}
			}
		}
		if (pager==null) {
			throw new MapperException("分页查询时必须提供入参:"+Pager.class.getName());
		}
		int startRow=(pager.getCurrentPage()-1)*pager.getNumPerPage();
		SQL sql = sqlParameter.sqlText(parameter);
		String pageSql=DbUtil.buildPageSQL(sqlParameter.datasourceId(),sql.getSql(), startRow, pager.getNumPerPage());
		List<Entity> entities=session.query(pageSql,new EntityListHandler(true), sql.getArgs());
		List<KVMap> dataList=new ArrayList<>();
		entities.forEach(e->{
			KVMap kvMap=new KVMap();
			kvMap.putAll(e);
			dataList.add(kvMap);
		});
		pager.setDataList(dataList);
		return pager;
	}
	
}
